extern "C"{
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
}

void *functionC(void*);
void *functionC2(void*);

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

int  counter = 0;

main()
{

   int rc1, rc2;

   pthread_t thread1, thread2;

   pthread_t threads[100];

   /* Create independent threads each of which will execute functionC */

 

   if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )

   {

      printf("Thread creation failed: %d\n", rc1);

   }

    counter ++; 

   if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )

   {

      printf("Thread creation failed: %d\n", rc2);

   }

 

   /* Wait till threads are complete before main continues. Unless we  */

   /* wait we run the risk of executing an exit which will terminate   */

   /* the process and all threads before the threads have completed.   */

 

   pthread_join( thread1, NULL);

   pthread_join( thread2, NULL);

   size_t i=0;
   for (; i<100; i++)
	if (i % 2 == 0)
	 if( (rc2=pthread_create( threads+i, NULL, &functionC2, NULL)) )

   {

      printf("Thread creation failed: %d\n", rc2);

   }
	 else
		if( (rc2=pthread_create( threads+i, NULL, &functionC, NULL)) )

   {

      printf("Thread creation failed: %d\n", rc2);

   }

   /* i=0;
	for (; i<100; i++)
		pthread_join(threads[i],NULL);*/

   exit(0);

}

 
void *functionC(void*)

{

   pthread_mutex_lock( &mutex1 );

   counter++;

   printf("Counter value: %d\n",counter);

   pthread_mutex_unlock( &mutex1 );

}

void *functionC2(void*)

{

   pthread_mutex_lock( &mutex1 );

   counter++;

   printf("Counter value (2): %d\n",counter);

   pthread_mutex_unlock( &mutex1 );

}
